package gdf

import (
	"fmt"
	"gitee.com/liumou_site/logger"
	"io"
	"net/http"
	"strconv"
)

// baseDownload 是一个用于下载文件的基础函数。
// 参数:
//
//	req: 已准备好的HTTP请求。
//	save: 布尔值，指示是否将下载的内容保存到磁盘。
//	debug: 布尔值，指示是否启用调试模式。
//	filename: 要保存的文件名。
//	maxSize: 允许的最大文件大小（以字节为单位）。
//
// 返回:
//
//	error: 如果下载过程中发生错误，返回具体的错误信息；否则返回nil。
func baseDownload(req *http.Request, save, debug bool, filename string, maxSize int64) error {
	// 发送HTTP请求并处理可能的错误。
	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		logger.Error("Error:", err)
		return err
	}

	// 确保HTTP响应体在函数返回前被正确关闭，以避免资源泄漏。
	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			logger.Error(err)
		}
	}(resp.Body)

	// 检查HTTP响应状态码是否表示成功或部分内容。
	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusPartialContent {
		logger.Error("Error: Status code", resp.StatusCode)
		return fmt.Errorf("error: Status code - %d", resp.StatusCode)
	}

	// 如果启用了调试模式，打印有关文件大小、类型和长度的调试信息。
	if debug {
		logger.Debug("File size:", resp.ContentLength/1024/1024, "MB")
		logger.Debug("File type -> " + resp.Header.Get("Content-Type"))
		logger.Debug("File length -> " + strconv.FormatInt(resp.ContentLength/1024/1024, 10))
	}

	// 检查文件大小是否超过允许的最大值。
	if maxSize != 0 && resp.ContentLength/1024/1024 > maxSize {
		logger.Error("Error: File size is too large")
		logger.Debug("当前设置最大大小为:", maxSize, "MB")
		logger.Debug("当前文件大小为:", resp.ContentLength/1024/1024, "MB")
		return fmt.Errorf("error: File size is too large")
	}

	// 根据'save'参数决定是将内容保存到磁盘还是仅仅读取到缓冲区。
	if save {
		return saveToDisk(filename, resp)
	} else {
		return buff(resp)
	}
}
